home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / vilbm / viewilbm.e < prev    next >
Text File  |  1994-05-02  |  12KB  |  294 lines

  1. /********************************************************************************
  2.  * << AUTO HEADER XDME >>
  3.  ********************************************************************************
  4.  ED             "EDG"
  5.  EC             "EC"
  6.  PREPRO         "EPP"
  7.  SOURCE         "ViewIlbm.e"
  8.  EPPDEST        "ViewIlbm_EPP.e"
  9.  EXEC           "ViewIlbm"
  10.  ISOURCE        " "
  11.  HSOURCE        " "
  12.  ERROREC        " "
  13.  ERROREPP       " "
  14.  VERSION        "0"
  15.  REVISION       "1"
  16.  NAMEPRG        "ViewIlbm"
  17.  NAMEAUTHOR     "NasGûl"
  18.  ********************************************************************************
  19.  * HISTORY :
  20.  *******************************************************************************/
  21.  
  22. OPT OSVERSION=39
  23.  
  24. ENUM ER_NONE,ER_GFX,ER_INTUI,ER_IFF,ER_REQTOOLS,ER_ONLYCLI,ER_BADARGS
  25.  
  26. MODULE 'graphics/gfxbase','graphics/displayinfo','dos/dos','intuition/screens','intuition/intuition'
  27. MODULE 'graphics/view','graphics/gfx','graphics/rastport'
  28. MODULE 'iff','libraries/iff'
  29. MODULE 'reqtools','libraries/reqtools'
  30. MODULE 'utility/tagitem'
  31.  
  32. DEF f_s[256]:STRING,opt_hires,opt_lace,opt_lores,opt_req,opt_info,opt_filereq
  33. DEF opt_did_cli,whith_req=FALSE
  34. DEF reqbody[500]:STRING
  35. DEF rast
  36.  
  37. PROC main() HANDLE /*"main()"*/
  38. /********************************************************************************
  39.  * Para         : NONE
  40.  * Return       : NONE
  41.  * Description  : Main proc.
  42.  *******************************************************************************/
  43.     DEF test_main
  44.     VOID {prg_banner}
  45.     IF (gfxbase:=OpenLibrary('graphics.library',37))=NIL THEN Raise(ER_GFX)
  46.     IF (intuitionbase:=OpenLibrary('intuition.library',37))=NIL THEN Raise(ER_INTUI)
  47.     IF (iffbase:=OpenLibrary('iff.library',23))=NIL THEN Raise(ER_IFF)
  48.     IF (reqtoolsbase:=OpenLibrary('reqtools.library',38))=NIL THEN Raise(ER_REQTOOLS)
  49.     IF wbmessage<>NIL
  50.         Raise(ER_ONLYCLI)
  51.     ELSE
  52.         IF (test_main:=start_from_cli())<>ER_NONE THEN Raise(test_main)
  53.     ENDIF
  54.     IF opt_filereq
  55.         my_filerequester()
  56.     ELSE
  57.         displayilbm(f_s)
  58.     ENDIF
  59.     Raise(ER_NONE)
  60. EXCEPT
  61.     IF reqtoolsbase THEN CloseLibrary(reqtoolsbase)
  62.     IF iffbase THEN CloseLibrary(iffbase)
  63.     IF intuitionbase THEN CloseLibrary(intuitionbase)
  64.     IF gfxbase THEN CloseLibrary(gfxbase)
  65.     SELECT exception
  66.         CASE ER_GFX;         WriteF('Graphics.library ?\n')
  67.         CASE ER_INTUI;       WriteF('Intuition.library ?\n')
  68.         CASE ER_IFF;         WriteF('Iff.library ?\n')
  69.         CASE ER_REQTOOLS;    WriteF('Reqtools.library ?\n')
  70.         CASE ER_ONLYCLI;     WriteF('Du cli uniquement.\n')
  71.         CASE ER_BADARGS;     WriteF('Mauvais Argument.\n')
  72.     ENDSELECT
  73. ENDPROC
  74. PROC my_filerequester() /*"my_filerequester()"*/
  75. /********************************************************************************
  76.  * Para         : NONE
  77.  * Return       : NONE
  78.  * Description  : PopUp a MultiFileRequester to choose the source(s).
  79.  *******************************************************************************/
  80.     DEF buffer[108]:STRING,add_liste
  81.     DEF fich[100]:STRING
  82.     DEF liste:PTR TO rtfilelist
  83.     DEF reqfile:PTR TO rtfilerequester
  84.     IF reqfile:=RtAllocRequestA(RT_FILEREQ,0)
  85.         buffer[0]:=0
  86.         add_liste:=RtFileRequestA(reqfile,buffer,'ViewIlbm v0.0a (c) NasGûl',[RTFI_FLAGS,FREQF_MULTISELECT,
  87.                                                                RTFI_OKTEXT,'_View',RTFI_HEIGHT,256,
  88.                                                                RT_UNDERSCORE,"_",
  89.                                                                TAG_DONE])
  90.         liste:=add_liste
  91.         IF buffer[0]<>0
  92.             WHILE liste
  93.                 AddPart(reqfile.dir,'',100)
  94.                 StrCopy(fich,reqfile.dir,ALL)
  95.                 StrAdd(fich,liste.name,ALL)
  96.                 StrCopy(f_s,fich,ALL)
  97.                 displayilbm(f_s)
  98.                 liste:=liste.next
  99.             ENDWHILE
  100.             RtFreeFileList(add_liste)
  101.         ENDIF
  102.         RtFreeRequest(reqfile)
  103.     ELSE
  104.         RtEZRequestA('Impossible d\aouvrir le sélécteur de fichiers.','Ok',0,0,[RTEZ_REQTITLE,'ViewIlbm v0.0a (c) 1994 NasGûl',
  105.                                                    TAG_DONE,0]:tagitem)
  106.     ENDIF
  107. ENDPROC
  108. PROC start_from_cli() /*"start_from_cli()"*/
  109. /********************************************************************************
  110.  * Para         : NONE
  111.  * Return       : ER_NONE if ok,else the error.
  112.  * Description  : Parse CLi arguments.
  113.  *******************************************************************************/
  114.     DEF myargs:PTR TO LONG,rdargs
  115.     myargs:=[0,0,0,0,0,0,0]
  116.     IF rdargs:=ReadArgs('FICHIER,HIRES/S,LACE/S,LORES/S,REQ/S,INFO/S,FILEREQ/S',myargs,NIL)
  117.         StringF(f_s,'\s',myargs[0])
  118.         IF opt_hires:=myargs[1] THEN opt_did_cli:=HIRES_KEY
  119.         IF opt_lace:=myargs[2] THEN opt_did_cli:=LORESLACE_KEY
  120.         IF (opt_hires:=myargs[1]) AND (opt_lace:=myargs[2]) THEN opt_did_cli:=HIRESLACE_KEY
  121.         IF (opt_lores:=myargs[3]) THEN opt_did_cli:=LORES_KEY
  122.         IF (opt_req:=myargs[4]) THEN whith_req:=TRUE
  123.         opt_info:=myargs[5]
  124.         opt_filereq:=myargs[6]
  125.         FreeArgs(rdargs)
  126.     ELSE
  127.         RETURN ER_BADARGS
  128.     ENDIF
  129.     RETURN ER_NONE
  130. ENDPROC
  131. PROC displayilbm(f_s) /*"displayilbm(f_s)"*/
  132. /********************************************************************************
  133.  * Para         : the source file (STRING).
  134.  * Return       : NONE
  135.  * Description  : View the source file.
  136.  *******************************************************************************/
  137.     DEF iff
  138.     DEF my_bmhd:PTR TO bmhd
  139.     DEF my_screen:PTR TO screen
  140.     DEF my_ns:PTR TO ns
  141.     DEF count,colortable[768]:ARRAY OF INT
  142.     DEF passe_chunk=NIL
  143.     DEF f_mode,adr_chunk_camg,offset_camg
  144.     DEF ret,x
  145.     DEF vquatre_bit=FALSE
  146.     IF iff:=IfFL_OpenIFF(f_s,IFFL_MODE_READ)
  147.         IF adr_chunk_camg:=IfFL_FindChunk(iff,"CAMG")
  148.             offset_camg:=adr_chunk_camg-iff
  149.         ENDIF
  150.         IF my_bmhd:=IfFL_GetBMHD(iff)
  151.             my_ns:=New(SIZEOF ns)
  152.             my_ns.type:=CUSTOMSCREEN+SCREENBEHIND+SCREENQUIET
  153.             my_ns.width:=my_bmhd.w
  154.             my_ns.height:=my_bmhd.h
  155.             my_ns.depth:=my_bmhd.nplanes
  156.             IF my_ns.depth>8
  157.                 my_ns.depth:=8
  158.                 vquatre_bit:=TRUE
  159.             ENDIF
  160.             f_mode:=IfFL_GetViewModes(iff)
  161.             IF whith_req=FALSE
  162.                 my_ns.viewmodes:=f_mode+opt_did_cli
  163.             ELSE
  164.                 my_ns.viewmodes:=choosedisplayid(f_mode)
  165.             ENDIF
  166.             IF my_screen:=OpenScreen(my_ns)
  167.                 /*PubScreenStatus(my_screen,0)*/
  168.                 rast:=my_screen.rastport
  169.                 count:=IfFL_GetColorTab(iff,colortable)
  170.                 IF vquatre_bit=FALSE
  171.                     IF (IfFL_FindChunk(iff,"CMAP"))
  172.                         LoadRGB4(my_screen.viewport,colortable,count)
  173.                     ELSE
  174.                         /*LoadRGB4(my_screen.viewport,{pal256},768)*/
  175.                     ENDIF
  176.                 ELSE
  177.                     FOR x:=0 TO 255 DO fullcolour(x,x,x,x)
  178.                 ENDIF
  179.                 IF (IfFL_DecodePic(iff,my_screen.bitmap))
  180.                     ScreenToFront(my_screen)
  181.                     StringF(reqbody,'ViewIlbm v0.0a © 1994 NasGûl\n'+
  182.                                'Image             Ecran\n'+
  183.                                'Width   :\l\d[8]  Width   :\l\d[8]\n'+
  184.                                'Height  :\l\d[8]  Height  :\l\d[8]\n'+
  185.                                'Depth   :\l\d[8]  Depth   :\l\d[8]\n'+
  186.                                'DisMode :\l\h[8]  DisMode :\l\h[8]\n',
  187.                                 my_bmhd.w,my_screen.width,
  188.                                 my_bmhd.h,my_screen.height,
  189.                                 my_bmhd.nplanes,my_ns.depth,
  190.                                 f_mode,my_ns.viewmodes)
  191.                     REPEAT
  192.                         IF Mouse()=3
  193.                             DisplayBeep(my_screen)
  194.                             passe_chunk:=my_ns.viewmodes
  195.                         ENDIF
  196.                     UNTIL Mouse()=2
  197.                     ScreenToBack(my_screen)
  198.                     IF opt_info THEN RtEZRequestA(reqbody,'_Ok',0,0,[RT_UNDERSCORE,"_",TAG_DONE,0])
  199.                 ELSE
  200.                     RtEZRequestA('can\at decode picture.','Ok',0,0,NIL)
  201.                 ENDIF
  202.                 CloseScreen(my_screen)
  203.                 Dispose(my_ns)
  204.             ELSE
  205.                 RtEZRequestA('can\at open screen.','Ok',0,0,NIL)
  206.             ENDIF
  207.         ELSE
  208.             RtEZRequestA('This file has not bitmap header.','Ok',0,0,NIL)
  209.         ENDIF
  210.         IF iff THEN IfFL_CloseIFF(iff)
  211.     ELSE
  212.         RtEZRequestA('Can\at open file \s','Ops',0,[f_s],NIL)
  213.     ENDIF
  214.     IF passe_chunk
  215.         IF vquatre_bit=FALSE
  216.             IF (RtEZRequestA('Save New Viewmodes in \s\n','_Yes|_No',0,[f_s],[RT_UNDERSCORE,"_",TAG_DONE,0]))
  217.                 ret:=save_chunk_viewmodes(passe_chunk,offset_camg)
  218.                 IF ret=FALSE THEN RtEZRequestA('Save NewModes Failed','_Ok',0,0,[RT_UNDERSCORE,"_",TAG_DONE,0])
  219.             ENDIF
  220.         ELSE
  221.             RtEZRequestA('No Save in 24 bits file !!','_Ok',0,0,[RT_UNDERSCORE,"_",TAG_DONE,0])
  222.         ENDIF
  223.     ENDIF
  224. ENDPROC
  225. PROC save_chunk_viewmodes(passe_chunk,offset_camg) /*"save_chunk_viewmodes(passe_chunk,offset_camg)"*/
  226. /********************************************************************************
  227.  * Para         : the chunk,the offset of the camg chunk.
  228.  * Return       : TRUE if ok,else FALSE
  229.  * Description  : Save the new Chunk Camg in file.
  230.  *******************************************************************************/
  231.   DEF len,adr,buf,handle,flen=TRUE,ccc
  232.   DEF new_chunk,my_buf_chunk[3]:LIST
  233.   IF (flen:=FileLength(f_s))=-1 THEN RETURN FALSE
  234.   IF (buf:=New(flen+1))=NIL THEN RETURN FALSE
  235.   IF (handle:=Open(f_s,1005))=NIL THEN RETURN FALSE
  236.   len:=Read(handle,buf,flen)
  237.   Close(handle)
  238.   IF len<1 THEN RETURN FALSE
  239.   new_chunk:=passe_chunk
  240.   my_buf_chunk:=[ID_CAMG,4,new_chunk]:LONG
  241.   adr:=buf
  242.   ccc:=adr+offset_camg
  243.   ^ccc:=ID_CAMG
  244.   ccc:=adr+offset_camg+4
  245.   ^ccc:=4
  246.   ccc:=adr+offset_camg+8
  247.   ^ccc:=new_chunk
  248.   handle:=Open(f_s,1006)
  249.   Write(handle,buf,len)
  250.   Close(handle)
  251.   Dispose(my_buf_chunk)
  252.   Dispose(buf)
  253.   RETURN TRUE
  254. ENDPROC
  255. PROC choosedisplayid(f_mode) /*"choosedisplayid(f_mode)"*/
  256. /********************************************************************************
  257.  * Para         : IDMode.
  258.  * Return       : The new IdMode selected.
  259.  * Description  : PopUp a ScreenModeRequester to choose the DisplayID.
  260.  *******************************************************************************/
  261.     DEF reqscreen:PTR TO rtscreenmoderequester
  262.     DEF retour
  263.     IF reqscreen:=RtAllocRequestA(RT_SCREENMODEREQ,NIL)
  264.             RtChangeReqAttrA(reqscreen,[RTSC_DISPLAYID,f_mode,TAG_DONE,0])
  265.             RtScreenModeRequestA(reqscreen,f_s,[RTSC_FLAGS,SCREQF_NONSTDMODES,TAG_DONE,0])
  266.             retour:=reqscreen.displayid
  267.             RtFreeRequest(reqscreen)
  268.     ENDIF
  269.     RETURN retour
  270. ENDPROC
  271. PROC fullcolour(nr,r,g,b) /*"fullcolour(nr,r,g,b)"*/
  272. /********************************************************************************
  273.  * Para         : Red,Green,Blue (0-255).
  274.  * Return       : NONE
  275.  * Description  : Make a SetRGB32().
  276.  *******************************************************************************/
  277.   MOVE.L rast,A0
  278.   SUB.L  #40,A0
  279.   MOVE.L nr,D0
  280.   MOVE.L r,D1
  281.   SWAP   D1
  282.   LSL.L  #8,D1
  283.   MOVE.L g,D2
  284.   SWAP   D2
  285.   LSL.L  #8,D2
  286.   MOVE.L b,D3
  287.   SWAP   D3
  288.   LSL.L  #8,D3
  289.   MOVE.L gfxbase,A6
  290.   JSR    -$354(A6)
  291. ENDPROC
  292. prg_banner:
  293. INCBIN 'ViewIlbm.header'
  294.